package com.wxy.bytebuffer;

import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author 47868
 */
public class 常见方法 {
    public static void main(String[] args) throws Exception {
        //分配空间 不能动态调整空间大小 超出容量保错
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        ByteBuffer buffer1 = ByteBuffer.allocateDirect(1024);
        //class java.nio.HeapByteBuffer java堆内存 读写效率低 受到垃圾回收影响
        System.out.println(buffer.getClass());
        //class java.nio.DirectByteBuffer 直接内存 读写效率高（少一次数据拷贝）不受垃圾回收影响 分配内存效率低
        System.out.println(buffer1.getClass());

        //写入数据 使用FileChannel
        FileChannel channel = new FileInputStream("text.txt").getChannel();
        int num = channel.read(buffer);
        while (num != 0) {
            buffer.flip();
            System.out.println((char)buffer.get());
            num--;
            buffer.compact();
        }
        //使用buffer.put()方法
        buffer.put(new byte[]{123, 124, 125});
        buffer.flip(); // 切换到读模式（limit=3, position=0）
        while (buffer.hasRemaining()) {
            System.out.println((char) buffer.get());
        }
        buffer.compact();
        System.out.println("-----------------------------------------");

        //读取数据
        //1.get()无参方法 不能重复 position指针移动
        buffer.put(new byte[]{92,93,94,95});
        buffer.flip();
        while (buffer.hasRemaining()) {
            System.out.println(buffer.get());
        }
        buffer.rewind();    //使position指针回到初始位置
        System.out.println(buffer.get());
        buffer.rewind();
        //2.get(int i)有参方法 根据索引读取数据 重复读取 position指针不移动 索引从0开始
        System.out.println("-----------------------------------------");

        //mark和reset
        for(int i = 0;i < 2;i++){
            System.out.println(buffer.get());
        }
        buffer.mark();  //打标记
        System.out.println(buffer.get());
        buffer.reset();     //回到标记处
        System.out.println(buffer.get());
    }
}
